﻿/**
 * Copyright(c) Live2D Inc. All rights reserved.
 *
 * Use of this source code is governed by the Live2D Open Software license
 * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.
 */

#pragma once

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <Math/CubismMatrix44.hpp>
#include <Math/CubismViewMatrix.hpp>
#include "CubismFramework.hpp"
#include <Rendering/OpenGL/CubismOffscreenSurface_OpenGLES2.hpp>

#include "LAppView_Common.hpp"

class TouchManager_Common;
class LAppSprite;
class LAppModel;
class LAppSpriteShader;

/**
* @brief 描画クラス
*/
class LAppView : public LAppView_Common
{
public:

	/**
	 * @brief LAppModelのレンダリング先
	 */
	enum SelectTarget
	{
		SelectTarget_None,                ///< デフォルトのフレームバッファにレンダリング
		SelectTarget_ModelFrameBuffer,    ///< LAppModelが各自持つフレームバッファにレンダリング
		SelectTarget_ViewFrameBuffer,     ///< LAppViewの持つフレームバッファにレンダリング
	};

	/**
	* @brief コンストラクタ
	*/
	LAppView();

	/**
	* @brief デストラクタ
	*/
	~LAppView();

	/**
	* @brief 初期化する。
	*/
	virtual void Initialize(int width, int height) override;

	/**
	* @brief 描画する。
	*/
	void Render();

	/**
	* @brief 画像の初期化を行う。
	*/
	void InitializeSprite();

	/**
	* @brief スプライト系のサイズ再設定
	*/
	void ResizeSprite();

	/**
	* @brief タッチされたときに呼ばれる。
	*
	* @param[in]       pointX            スクリーンX座標
	* @param[in]       pointY            スクリーンY座標
	*/
	void OnTouchesBegan(float pointX, float pointY) const;

	/**
	* @brief タッチしているときにポインタが動いたら呼ばれる。
	*
	* @param[in]       pointX            スクリーンX座標
	* @param[in]       pointY            スクリーンY座標
	*/
	void OnTouchesMoved(float pointX, float pointY) const;

	/**
	* @brief タッチが終了したら呼ばれる。
	*
	* @param[in]       pointX            スクリーンX座標
	* @param[in]       pointY            スクリーンY座標
	*/
	void OnTouchesEnded(float pointX, float pointY) const;

	/**
	 * @brief   モデル1体を描画する直前にコールされる
	 */
	void PreModelDraw(LAppModel& refModel);

	/**
	 * @brief   モデル1体を描画した直後にコールされる
	 */
	void PostModelDraw(LAppModel& refModel);

	/**
	 * @brief   別レンダリングターゲットにモデルを描画するサンプルで
	 *           描画時のαを決定する
	 */
	float GetSpriteAlpha(int assign) const;

	/**
	 * @brief レンダリング先を切り替える
	 */
	void SwitchRenderingTarget(SelectTarget targetType);

	/**
	 * @brief レンダリング先をデフォルト以外に切り替えた際の背景クリア色設定
	 * @param[in]   r   赤(0.0~1.0)
	 * @param[in]   g   緑(0.0~1.0)
	 * @param[in]   b   青(0.0~1.0)
	 */
	void SetRenderTargetClearColor(float r, float g, float b);

private:
	TouchManager_Common* _touchManager;                 ///< タッチマネージャー
	//LAppSprite* _back;                       ///< 背景画像
	//LAppSprite* _gear;                       ///< ギア画像
	//LAppSprite* _power;                      ///< 電源画像

	// レンダリング先を別ターゲットにする方式の場合に使用
	LAppSprite* _renderSprite;                                      ///< モードによっては_renderBufferのテクスチャを描画
	Csm::Rendering::CubismOffscreenSurface_OpenGLES2 _renderBuffer;   ///< モードによってはCubismモデル結果をこっちにレンダリング
	SelectTarget _renderTarget;     ///< レンダリング先の選択肢
	float _clearColor[4];           ///< レンダリングターゲットのクリアカラー

	LAppSpriteShader* _spriteShader;   ///< シェーダー作成委譲クラス
};
